From 7c200f8a9c9985c483f6293d79d8b4192e2e6a4a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Robert=20=C3=96gren?= Date: Thu, 27 May 2004 02:15:42 +0000 Subject: [PATCH] Send key modifiers (shift, ctrl etc) in button and motion events from the MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2004-05-26 Robert Ögren * gdk/win32/gdkinput-win32.c (_gdk_input_other_event): Send key modifiers (shift, ctrl etc) in button and motion events from the tablet. (#143240) 2004-05-26 Robert Ögren * gdk/win32/gdkinput-win32.c (gdk_device_get_state): Simple implementation for extended input devices using last known device state (#143237) --- ChangeLog | 12 ++++++ ChangeLog.pre-2-10 | 12 ++++++ ChangeLog.pre-2-6 | 12 ++++++ ChangeLog.pre-2-8 | 12 ++++++ gdk/win32/gdkinput-win32.c | 88 ++++++++++++++++++++++---------------- 5 files changed, 99 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index d601de7a6a..d666a25127 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (_gdk_input_other_event): Send key + modifiers (shift, ctrl etc) in button and motion events from the + tablet. (#143240) + +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (gdk_device_get_state): Simple + implementation for extended input devices using last known + device state (#143237) + Tue May 25 21:54:00 2004 Matthias Clasen * gtk/gtkframe.c: Move docs inline, fixing them on the diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d601de7a6a..d666a25127 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (_gdk_input_other_event): Send key + modifiers (shift, ctrl etc) in button and motion events from the + tablet. (#143240) + +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (gdk_device_get_state): Simple + implementation for extended input devices using last known + device state (#143237) + Tue May 25 21:54:00 2004 Matthias Clasen * gtk/gtkframe.c: Move docs inline, fixing them on the diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d601de7a6a..d666a25127 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (_gdk_input_other_event): Send key + modifiers (shift, ctrl etc) in button and motion events from the + tablet. (#143240) + +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (gdk_device_get_state): Simple + implementation for extended input devices using last known + device state (#143237) + Tue May 25 21:54:00 2004 Matthias Clasen * gtk/gtkframe.c: Move docs inline, fixing them on the diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d601de7a6a..d666a25127 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (_gdk_input_other_event): Send key + modifiers (shift, ctrl etc) in button and motion events from the + tablet. (#143240) + +2004-05-26 Robert Ögren + + * gdk/win32/gdkinput-win32.c (gdk_device_get_state): Simple + implementation for extended input devices using last known + device state (#143237) + Tue May 25 21:54:00 2004 Matthias Clasen * gtk/gtkframe.c: Move docs inline, fixing them on the diff --git a/gdk/win32/gdkinput-win32.c b/gdk/win32/gdkinput-win32.c index 59b2d10eb6..7442b72aae 100644 --- a/gdk/win32/gdkinput-win32.c +++ b/gdk/win32/gdkinput-win32.c @@ -694,6 +694,31 @@ _gdk_input_enter_event (GdkWindow *window) input_window->root_y = root_y; } +/** + * Get the currently active keyboard modifiers (ignoring the mouse buttons) + * We could use gdk_window_get_pointer but that function does a lot of other + * expensive things besides getting the modifiers. This code is somewhat based + * on build_pointer_event_state from gdkevents-win32.c + */ +static guint +get_modifier_key_state (void) +{ + guint state; + + state = 0; + /* High-order bit is up/down, low order bit is toggled/untoggled */ + if (GetKeyState (VK_CONTROL) < 0) + state |= GDK_CONTROL_MASK; + if (GetKeyState (VK_SHIFT) < 0) + state |= GDK_SHIFT_MASK; + if (GetKeyState (VK_MENU) < 0) + state |= GDK_MOD1_MASK; + if (GetKeyState (VK_CAPITAL) & 0x1) + state |= GDK_LOCK_MASK; + + return state; +} + gboolean _gdk_input_other_event (GdkEvent *event, MSG *msg, @@ -708,6 +733,7 @@ _gdk_input_other_event (GdkEvent *event, GdkInputWindow *input_window; GdkDevicePrivate *gdkdev = NULL; GdkEventMask masktest; + guint key_state; POINT pt; PACKET packet; @@ -878,7 +904,7 @@ _gdk_input_other_event (GdkEvent *event, return FALSE; event->any.window = window; - + key_state = get_modifier_key_state (); if (event->any.type == GDK_BUTTON_PRESS || event->any.type == GDK_BUTTON_RELEASE) { @@ -903,7 +929,8 @@ _gdk_input_other_event (GdkEvent *event, event->button.state = ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK - | GDK_BUTTON5_MASK)); + | GDK_BUTTON5_MASK)) + | key_state; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB button %s:%d %g,%g\n", (event->button.type == GDK_BUTTON_PRESS ? @@ -928,7 +955,8 @@ _gdk_input_other_event (GdkEvent *event, event->motion.state = ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK - | GDK_BUTTON5_MASK)); + | GDK_BUTTON5_MASK)) + | key_state; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB motion: %g,%g\n", @@ -959,7 +987,8 @@ _gdk_input_other_event (GdkEvent *event, event2->button.state = ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK - | GDK_BUTTON5_MASK)); + | GDK_BUTTON5_MASK)) + | key_state; event2->button.button = 1; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB synthesized button %s: %d %g,%gg\n", @@ -1196,42 +1225,27 @@ gdk_device_get_state (GdkDevice *device, GdkDevicePrivate *gdkdev; GdkInputWindow *input_window; - if (mask) - gdk_window_get_pointer (window, NULL, NULL, mask); - gdkdev = (GdkDevicePrivate *)device; - input_window = _gdk_input_window_find (window); - g_return_if_fail (input_window != NULL); - -#if 0 /* FIXME */ - state = XQueryDeviceState (gdk_display, gdkdev->xdevice); - input_class = state->data; - for (i = 0; i < state->num_classes; i++) + /* For now just use the last known button and axis state of the device. + * Since graphical tablets send an insane amount of motion events each + * second, the info should be fairly up to date */ + if (mask) { - switch (input_class->class) - { - case ValuatorClass: - if (axes) - gdk_input_translate_coordinates (gdkdev, input_window, - ((XValuatorState *)input_class)->valuators, - axes, NULL, NULL); - break; - - case ButtonClass: - if (mask) - { - *mask &= 0xFF; - if (((XButtonState *)input_class)->num_buttons > 0) - *mask |= ((XButtonState *)input_class)->buttons[0] << 7; - /* GDK_BUTTON1_MASK = 1 << 8, and button n is stored - * in bit 1<<(n%8) in byte n/8. n = 1,2,... */ - } - break; - } - input_class = (XInputClass *)(((char *)input_class)+input_class->length); + gdk_window_get_pointer (window, NULL, NULL, mask); + *mask &= 0xFF; /* Mask away core pointer buttons */ + *mask |= ((gdkdev->button_state << 8) + & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK + | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK + | GDK_BUTTON5_MASK)); } - XFreeDeviceState (state); -#endif + input_window = _gdk_input_window_find (window); + g_return_if_fail (input_window != NULL); + /* For some reason, input_window is sometimes NULL when I use The GIMP 2 + * (bug #141543?). Avoid crashing if debugging is disabled. */ + if (axes && gdkdev->last_axis_data && input_window) + gdk_input_translate_coordinates (gdkdev, input_window, + gdkdev->last_axis_data, + axes, NULL, NULL); } } -- 2.30.2